package com.atguigu.gmall.pms.service.impl;

import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.entity.SkuImagesEntity;
import com.atguigu.gmall.pms.feign.GmallSmsClient;
import com.atguigu.gmall.pms.service.SkuAttrValueService;
import com.atguigu.gmall.pms.service.SkuImagesService;
import com.atguigu.gmall.pms.vo.SkuVo;
import com.atguigu.gmall.pms.vo.SpuVo;
import com.atguigu.gmall.sms.vo.SkuSaleInfoVo;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuMapper;
import com.atguigu.gmall.pms.entity.SkuEntity;
import com.atguigu.gmall.pms.service.SkuService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;


@Service("skuService")
public class SkuServiceImpl extends ServiceImpl<SkuMapper, SkuEntity> implements SkuService {
    @Autowired
    SkuImagesService skuImagesService;
    @Autowired
    SkuAttrValueService skuAttrValueService;
    @Autowired
    GmallSmsClient gmallSmsClient;
    @Transactional
    public void saveSkus(SpuVo spuVo, Long spuId) {
        List<SkuVo> skuVos = spuVo.getSkus();
        //每个sku的数据包含：sku、sku_images、sku_attr_value、sku的营销属性(sms库的表)
        skuVos.forEach(skuVo -> {
            //4.1 保存sku
            SkuEntity skuEntity = new SkuEntity();
            BeanUtils.copyProperties(skuVo,skuEntity);
            skuEntity.setSpuId(spuId);
            skuEntity.setCategoryId(spuVo.getCategoryId());
            skuEntity.setBrandId(spuVo.getBrandId());
            //sku有多张图片，可以使用第一张当做默认图片
            List<String> images = skuVo.getImages();
            if(!CollectionUtils.isEmpty(images)){
                skuEntity.setDefaultImage(images.get(0));
            }
            this.save(skuEntity);
            Long skuId = skuEntity.getId();

            //4.2 保存skuimages
            if(!CollectionUtils.isEmpty(images)){
                //每张图片和skuId绑定存入到 images表中
                //将每张图片转为一个SkuImagesEntity对象
                List<SkuImagesEntity> skuImagesEntities = images.stream().map(image -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setUrl(image);
                    skuImagesEntity.setSort(0);
                    //1代表图片是默认图片
                    skuImagesEntity.setDefaultStatus(image.equals(skuEntity.getDefaultImage()) ? 1 : 0);
                    return skuImagesEntity;
                }).collect(Collectors.toList());
                skuImagesService.saveBatch(skuImagesEntities);
            }

            //4.3 保存sku_attr_value
            List<SkuAttrValueEntity> skuAttrValueEntities = skuVo.getSaleAttrs();
            skuAttrValueEntities.forEach(skuAttrValueEntity -> {
                skuAttrValueEntity.setSkuId(skuId);
                skuAttrValueEntity.setSort(0);
            });
            skuAttrValueService.saveBatch(skuAttrValueEntities);

            //4.4 保存营销信息： 远程访问
            //满减、积分、折扣
            //数据提交给sms服务来处理保存
            SkuSaleInfoVo skuSaleInfoVo = new SkuSaleInfoVo();
            BeanUtils.copyProperties(skuVo, skuSaleInfoVo);
            //将skuid设置给skuSaleInfoVo
            skuSaleInfoVo.setSkuId(skuId);
            gmallSmsClient.saveSkuSaleInfo(skuSaleInfoVo);
        });
    }

    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuEntity>()
        );

        return new PageResultVo(page);
    }

}